package cn.itcast.web.controller.system;

import cn.itcast.domain.system.Dept;
import cn.itcast.domain.system.Role;
import cn.itcast.domain.system.User;
import cn.itcast.service.system.DeptService;
import cn.itcast.service.system.RoleService;
import cn.itcast.service.system.UserService;
import com.github.pagehelper.PageInfo;
import com.github.pagehelper.util.StringUtil;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/system/user")
public class UserController extends BaseController {
  @Autowired
  private DeptService deptService;
  @Autowired
  private UserService userService;
  @Autowired
  private RoleService roleService;

  /*
    方法的作用：展示用户列表
    url: /system/user/list.do
    参数： 当前页， 页面大小
    返回： system/user/user-list
     */
  @RequestMapping("/list")
  /*@RequiresPermissions("用户管理")*/
  public String list(@RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "5") int pageSize) {
    //添加权限检查的代码之后，则要求访问者必须拥有权限才能访问,使用硬编码的方式去检查权限
    /*Subject subject = SecurityUtils.getSubject();
    subject.checkPermission("用户管理");*/

    //1. 查询到pageInfo对象
    //companyId是指当前登陆者所属的公司id.;
    PageInfo<User> pageInfo = userService.findByPage(pageNum, pageSize, getLoginCompanyId());
    //2. 把PageInfo存储到域中
    request.setAttribute("pageInfo", pageInfo);
    System.out.println(pageInfo.getList());
    //3. 返回到列表页面
    return "system/user/user-list";
  }

  /*
  方法的作用：进入添加用户的页面
  url: /system/user/toAdd.do
  参数： 无
  返回： system/user/user-add
   */
  @RequestMapping("/toAdd")
  public ModelAndView toAdd() {
    //1. 查询所有的部门信息，用于展示部门的下拉列表
    List<Dept> deptList = deptService.findAll(getLoginCompanyId());
    ModelAndView mv = new ModelAndView();
    mv.addObject("deptList", deptList);
    mv.setViewName("system/user/user-add");
    return mv;
   /* request.setAttribute("deptList",deptList);
    return "system/user/user-add";*/
  }

  /*
   方法的作用：保存添加用户以及更新用户的信息
   url: /system/user/edit.do
   参数： user 对象
   返回： 用户列表
    */
  @RequestMapping("/edit")
  public String edit(User user) {
    //设置当前部门所属的公司
    user.setCompanyId(getLoginCompanyId());
    user.setCompanyName(getLoginCompanyName());
    if (StringUtil.isEmpty(user.getId())) {
      //如果id为空，则为保存
      userService.save(user);
    } else {
      //如果id不为空， 则为更新
      userService.update(user);
    }
       /*
            如果返回的路径带有redirect或者是forward是不经过视图解析器。

            路径：
                绝对路径:   不以/开头的路径都是相对路径 , 相对当前程序所在的路径,当前程序所在路径是会发生变化的。
                相对路径：  "/"那这种就是绝对路径
         */
    //这里的"/"代表  http://localhost8080/
    return "redirect:/system/user/list.do";
  }

  /*
 方法的作用：进入修改用户的页面
 url: /system/user/toUpdate.do?id=97f88a8c-90fc-4d52-aed7-2046f62fb498
 参数： id 用户的id
 返回： /system/user/user-update
  */
  @RequestMapping("/toUpdate")
  public String toUpdate(String id) {
    //1. 根据id查询一个用户对象，存储到域中
    User user = userService.findById(id);
    request.setAttribute("user", user);
    //2. 查询所有的部门对象，用于展示父部门列表，存储到域中
    List<Dept> deptList = deptService.findAll(getLoginCompanyId());
    request.setAttribute("deptList", deptList);
    //3. 返回用户更新页面
    return "system/user/user-update";
  }

  /*
   方法的作用：删除用户
   url: /system/user/delete.do?id=97f88a8c-90fc-4d52-aed7-2046f62fb498
   参数： id 用户的id
   返回： json对象

   json = {flag:true|false , message:"删除成功|删除失败"}
    */
  @RequestMapping("/delete")
  @ResponseBody
  public Map<String, Object> delete(String id) {
    Map<String, Object> map = new HashMap<>();
    boolean flag = userService.delete(id);
    if (flag) {
      //删除成功
      map.put("flag", true);
      map.put("message", "删除成功");
    } else {
      map.put("flag", false);
      map.put("message", "删除失败,该用户已经被分配角色了");
    }
    return map;
  }

  /*
 方法的作用：进入修改用户的页面
 url:/system/user/roleList.do?id=002108e2-9a10-4510-9683-8d8fd1d374ef
 参数： id 用户的id
 返回： /system/user/user-role.jsp
  */
  @RequestMapping("/roleList")
  public String roleList(String id) {
    //1. 根据id查找用户，并且存储到域中。
    User user = userService.findById(id);
    request.setAttribute("user", user);
    //2. 查询所有的角色
    List<Role> roleList = roleService.findAll(getLoginCompanyId());
    request.setAttribute("roleList",roleList);
    //3. 当前用户具备的角色
    List<Role> userRoleList = roleService.findUserRoleByUserId(id);
    request.setAttribute("userRoleList", userRoleList);
    return "system/user/user-role";
  }

  /*
     url: /system/user/changeRole.do
     作用： 修改用户的角色
     参数： userid, roleIds
     返回值：用户列表页面
    */
  @RequestMapping("/changeRole")
  public String changeRole(String userid, String[] roleIds) {
    userService.changeRole(userid, roleIds);
    return "redirect:/system/user/list.do";
  }
}
